<?php

/**
 * 请求类
 * ============================================================================
 * api说明：
 * init(),初始化函数，默认给一些参数赋值，如cmdno,date等。
 * getGateURL()/setGateURL(),获取/设置入口地址,不包含参数值
 * getKey()/setKey(),获取/设置密钥
 * getParameter()/setParameter(),获取/设置参数值
 * getAllParameters(),获取所有参数
 * getRequestURL(),获取带参数的请求URL
 * getDebugInfo(),获取debug信息
 * ============================================================================
 */
class RequestHandler {
    
    /**
     * 网关url地址
     */
    var $gateUrl;
    
    /**
     * 密钥
     */
    var $key;
    
    /**
     * 请求的参数
     */
    var $parameters;
    
    /**
     * debug信息
     */
    var $debugInfo;
    function __construct() {
        $this->RequestHandler();
    }
    function RequestHandler() {
        $this->gateUrl = "'https://pay.swiftpass.cn/pay/gateway";
        $this->key = "";
        $this->parameters = array();
        $this->debugInfo = "";
    }
    
    /**
     * 初始化函数。
     */
    function init() {
        // nothing to do
    }
    
    /**
     * 获取入口地址,不包含参数值
     */
    function getGateURL() {
        return $this->gateUrl;
    }
    
    /**
     * 设置入口地址,不包含参数值
     */
    function setGateURL($gateUrl) {
        $this->gateUrl = $gateUrl;
    }
    
    /**
     * 获取密钥
     */
    function getKey() {
        return $this->key;
    }
    
    /**
     * 设置密钥
     */
    function setKey($key) {
        $this->key = $key;
    }
    
    /**
     * 获取参数值
     */
    function getParameter($parameter) {
        return isset($this->parameters[$parameter]) ? $this->parameters[$parameter] : '';
    }
    
    /**
     * 设置参数值
     */
    function setParameter($parameter, $parameterValue) {
        $this->parameters[$parameter] = $parameterValue;
    }
    
    /**
     * 一次性设置参数
     */
    function setReqParams($post, $filterField = null) {
        if ($filterField !== null) {
            forEach ($filterField as $k => $v) {
                unset($post[$v]);
            }
        }
        
        // 判断是否存在空值，空值不提交
        forEach ($post as $k => $v) {
            if (empty($v)) {
                unset($post[$k]);
            }
        }
        
        $this->parameters = $post;
    }
    
    /**
     * 获取所有请求的参数
     * 
     * @return array
     */
    function getAllParameters() {
        return $this->parameters;
    }
    
    /**
     * 获取带参数的请求URL
     */
    function getRequestURL() {
        $this->createSign();
        
        $reqPar = "";
        ksort($this->parameters);
        foreach ($this->parameters as $k => $v) {
            $reqPar .= $k . "=" . urlencode($v) . "&";
        }
        
        // 去掉最后一个&
        $reqPar = substr($reqPar, 0, strlen($reqPar) - 1);
        
        $requestURL = $this->getGateURL() . "?" . $reqPar;
        
        return $requestURL;
    }
    
    /**
     * 获取debug信息
     */
    function getDebugInfo() {
        return $this->debugInfo;
    }
    
    /**
     * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
     */
    function createSign() {
        $signPars = "";
        ksort($this->parameters);
        foreach ($this->parameters as $k => $v) {
            if ("" != $v && "sign" != $k) {
                $signPars .= $k . "=" . $v . "&";
            }
        }
        $signPars .= "key=" . $this->getKey();
        $sign = strtoupper(md5($signPars));
        $this->setParameter("sign", $sign);
        
        // debug信息
        $this->_setDebugInfo($signPars . " => sign:" . $sign);
    }
    
    /**
     * 设置debug信息
     */
    function _setDebugInfo($debugInfo) {
        $this->debugInfo = $debugInfo;
    }
}

?>